﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using System.Web.Routing;
using ControleRepresentante.Logic.Models;
using ControleRepresentante.Logic.Repositories;
using ControleRepresentante.Logic.Statistics;
using ControleRepresentante.UnitTests.Mocks;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using WebSite.Controllers;
using WebSite.ViewModels;
using WebSite.ViewModels.EditViewModels;
using WebSite.ViewModels.Fields;
using WebSite.ViewModels.IndexViewModels;
using Attribute = ControleRepresentante.Logic.Models.Attribute;

namespace ControleRepresentante.UnitTests.Controllers
{
    [TestClass]
    public class PedidoControllerTests : CRUDControllerTestScenarioBase<PedidoController, Pedido, IPedidoRepository, PedidoStatistics>
    {
        private const string CondicaoPagamento = "condicao de pagamento";
        private const string PrazoEntrega = "prazo de entrega";
        private const string Observacao = "observacao";
        private Guid m_VendedorId;
        private Guid m_ClienteId;
        private Guid m_TransportadoraId;
        private Guid m_FabricaId;
        private readonly DateTime m_Data = DateTime.Now;
        private Representante m_Representante;
        private const bool Faturado = true;
        private const bool Cancelado = false;
        private const double Desconto = 654.321;

        protected override bool ShouldRunTestCreateDuplicatedField { get { return false; } }
        protected override bool ShouldRunTestCreateEmptyFields { get { return false; } }
        protected override bool ShouldRunTestEditDuplicatedFields { get { return false; } }
        protected override bool ShouldRunTestEditEmptyFields { get { return false; } }

        protected override object[] GetRepositoryParameters()
        {
            return base.GetRepositoryParameters().Union(new object[] {ImpostProvider}).ToArray();
        }

        protected override PedidoController CreateController(bool isRepresentante = true)
        {
            this.LoginAsAdmin();
            Guid representanteId = this.CreateRepresentante("repre", true, "repreuser");
            m_Representante = RepositoryProvider.GetRepository<IRepresentanteRepository>().GetModelById(representanteId);
            this.CreateRepresentante("otherrepre", false, "other");
            this.Logout();
            this.LoginAs("repreuser");

            m_VendedorId = this.CreateVendedor(new Vendedor{Nome = "vendedor"});
            Cliente cliente = new Cliente
            {
                RazaoSocial = "cliente",
                NomeFantasia = "cliente",
                Vendedor = new Vendedor {Id = m_VendedorId}
            };
            m_ClienteId = this.CreateCliente(cliente);
            m_TransportadoraId = this.CreateTransportadora(new Transportadora{Nome = "transportadora"});
            m_FabricaId = this.CreateFabrica(new Fabrica{Nome = "fabrica", CNPJ = "cnpj", InscricaoEstadual = "inscricao"});

            if (!isRepresentante)
            {
                this.Logout();
            }
            return new PedidoController(RepositoryProvider, SessionConfiguration, ControllerExtensionProvider, PrintTemplateSelector, ImpostProvider);
        }

        protected override Pedido CreateModel()
        {
            return new Pedido
            {
                Vendedor = RepositoryProvider.GetRepository<IVendedorRepository>().GetModelById(m_VendedorId),
                Cliente = RepositoryProvider.GetRepository<IClienteRepository>().GetModelById(m_ClienteId),
                Transportadora =
                    RepositoryProvider.GetRepository<ITransportadoraRepository>().GetModelById(m_TransportadoraId),
                Fabrica = RepositoryProvider.GetRepository<IFabricaRepository>().GetModelById(m_FabricaId),
                Representante = m_Representante
            };
        }

        protected override ActionResult Create(PedidoController controller)
        {
            return controller.Create(m_ClienteId, m_VendedorId, m_FabricaId, m_TransportadoraId, m_Data, CondicaoPagamento, PrazoEntrega, Observacao, Desconto, Faturado, Cancelado);
        }

        protected override void VerifyModel(Pedido model)
        {
            Assert.AreEqual(m_ClienteId, model.Cliente.Id);
            Assert.AreEqual(m_VendedorId, model.Vendedor.Id);
            Assert.AreEqual(m_FabricaId, model.Fabrica.Id);
            Assert.AreEqual(m_TransportadoraId, model.Transportadora.Id);
            Assert.AreEqual(0, m_Data.Subtract(model.Data).Seconds);
            Assert.AreEqual(CondicaoPagamento, model.CondicaoPagamento);
            Assert.AreEqual(PrazoEntrega, model.PrazoEntrega);
            Assert.AreEqual(Observacao, model.Observacao);
            Assert.AreEqual(Desconto, model.Desconto);
            Assert.AreEqual(Faturado, model.Faturado);
            Assert.AreEqual(Cancelado, model.Cancelado);
        }

        protected override ActionResult CreateEmptyFields(PedidoController controller)
        {
            return controller.Create(m_ClienteId, m_VendedorId, m_FabricaId, m_TransportadoraId, m_Data, CondicaoPagamento, PrazoEntrega, Observacao, Desconto, Faturado, Cancelado);
        }

        protected override void VerifyModelEmptyFields(Pedido model)
        {
        }

        protected override ActionResult CreateDuplicatedModel(PedidoController controller, Pedido model)
        {
            return controller.Create(m_ClienteId, m_VendedorId, m_FabricaId, m_TransportadoraId, m_Data, CondicaoPagamento, PrazoEntrega, Observacao, Desconto, Faturado, Cancelado);
        }

        protected override void VerifyDuplicatedModel(Pedido originalModel, Pedido duplicatedModel)
        {
        }

        protected override ActionResult Edit(PedidoController controller)
        {
            return controller.Edit(m_ClienteId, m_VendedorId, m_FabricaId, m_TransportadoraId, m_Data, CondicaoPagamento, PrazoEntrega, Observacao, Desconto, Faturado, Cancelado);
        }

        protected override ActionResult EditEmptyFields(PedidoController controller)
        {
            return controller.Edit(m_ClienteId, m_VendedorId, m_FabricaId, m_TransportadoraId, m_Data, CondicaoPagamento, PrazoEntrega, Observacao, Desconto, Faturado, Cancelado);
        }

        protected override ActionResult EditDuplicatedModel(PedidoController controller, Pedido modelToDuplicate)
        {
            return controller.Edit(m_ClienteId, m_VendedorId, m_FabricaId, m_TransportadoraId, m_Data, CondicaoPagamento, PrazoEntrega, Observacao, Desconto, Faturado, Cancelado);
        }

        #region Produto

        [TestMethod]
        public void TestDeleteProduto()
        {
            PedidoController pedidoController = CreateController();
            Produto produto = new Produto {Descricao = "descricao"};
            Pedido pedido = new Pedido
            {
                Cliente = new Cliente {Id = m_ClienteId},
                Vendedor = new Vendedor {Id = m_VendedorId},
                Fabrica = new Fabrica {Id = m_FabricaId},
                Transportadora = new Transportadora {Id = m_TransportadoraId},
                Representante = m_Representante
            };
            pedido.AddProduto(produto);
            IPedidoRepository pedidoRepository = RepositoryProvider.GetRepository<IPedidoRepository>(ImpostProvider);
            pedidoRepository.AddModel(pedido);
            PedidoStatistics statistics;
            Assert.AreEqual(1, pedidoRepository.GetModels(out statistics).Count());
            Assert.AreEqual(1, pedidoRepository.GetModels(out statistics).First().Produtos.Count());
            pedidoController.Edit(pedido.Id);
            pedidoController.ProdutoDelete(pedido.Produtos.First().Id);
            ActionResult actionResult = pedidoController.Edit(m_ClienteId, m_VendedorId, m_FabricaId, m_TransportadoraId, m_Data, CondicaoPagamento, PrazoEntrega, Observacao, Desconto, Faturado, Cancelado);
            Assert.AreEqual(1, pedidoRepository.GetModels(out statistics).Count());
            IEnumerable<Produto> produtos = pedidoRepository.GetModels(out statistics).First().Produtos;
            Assert.IsFalse(produtos.Any());
            Assert.IsInstanceOfType(actionResult, typeof(RedirectToRouteResult));
            RedirectToRouteResult redirectToRouteResult = (RedirectToRouteResult)actionResult;
            Assert.AreEqual("Details", redirectToRouteResult.RouteValues["action"]);
            Assert.AreEqual(pedido.Id, redirectToRouteResult.RouteValues["id"]);
        }

        [TestMethod]
        public void TestCreateProduto()
        {
            PedidoController pedidoController = CreateController();
            Pedido pedido = new Pedido
            {
                Cliente = new Cliente {Id = m_ClienteId},
                Vendedor = new Vendedor {Id = m_VendedorId},
                Fabrica = new Fabrica {Id = m_FabricaId},
                Transportadora = new Transportadora {Id = m_TransportadoraId},
                Representante = m_Representante
            };
            IPedidoRepository pedidoRepository = RepositoryProvider.GetRepository<IPedidoRepository>(ImpostProvider);
            pedidoRepository.AddModel(pedido);
            pedidoController.Edit(pedido.Id);

            const int Quantidade = 3;
            const string Codigo = "codigo";
            const string Descricao = "descricao";
            const double PrecoUnitario = 1.2;

            pedidoController.ProdutoInsert(Quantidade, Codigo, Descricao, PrecoUnitario);
            ActionResult actionResult = pedidoController.Edit(m_ClienteId, m_VendedorId, m_FabricaId, m_TransportadoraId, m_Data, CondicaoPagamento, PrazoEntrega, Observacao, Desconto, Faturado, Cancelado);
            pedido = pedidoRepository.GetModelById(pedido.Id);
            Assert.AreEqual(1, pedido.Produtos.Count());
            Produto produto = pedido.Produtos.First();
            Assert.AreEqual(Quantidade, produto.Quantidade);
            Assert.AreEqual(Codigo, produto.Codigo);
            Assert.AreEqual(Descricao, produto.Descricao);
            Assert.AreEqual(PrecoUnitario, produto.PrecoUnitario);
            Assert.IsInstanceOfType(actionResult, typeof(RedirectToRouteResult));
            RedirectToRouteResult redirectToRouteResult = (RedirectToRouteResult)actionResult;
            Assert.AreEqual("Details", redirectToRouteResult.RouteValues["action"]);
            Assert.AreEqual(pedido.Id, redirectToRouteResult.RouteValues["id"]);
        }

        [TestMethod]
        public void TestEditProduto()
        {
            PedidoController pedidoController = CreateController();
            Produto produto = new Produto { Descricao = "a"};
            Pedido pedido = new Pedido
            {
                Cliente = new Cliente {Id = m_ClienteId},
                Vendedor = new Vendedor {Id = m_VendedorId},
                Fabrica = new Fabrica {Id = m_FabricaId},
                Transportadora = new Transportadora {Id = m_TransportadoraId},
                Representante = m_Representante
            };
            pedido.AddProduto(produto);
            IPedidoRepository pedidoRepository = RepositoryProvider.GetRepository<IPedidoRepository>(ImpostProvider);
            pedidoRepository.AddModel(pedido);
            pedidoController.Edit(pedido.Id);

            const int Quantidade = 3;
            const string Codigo = "codigo";
            const string Descricao = "descricao";
            const double PrecoUnitario = 1.2;

            pedidoController.ProdutoUpdate(produto.Id, Quantidade, Codigo, Descricao, PrecoUnitario);
            ActionResult actionResult = pedidoController.Edit(m_ClienteId, m_VendedorId, m_FabricaId, m_TransportadoraId, m_Data, CondicaoPagamento, PrazoEntrega, Observacao, Desconto, Faturado, Cancelado);
            Assert.IsInstanceOfType(actionResult, typeof(RedirectToRouteResult));
            RedirectToRouteResult redirectToRouteResult = (RedirectToRouteResult)actionResult;
            Assert.AreEqual("Details", redirectToRouteResult.RouteValues["action"]);
            Assert.AreEqual(pedido.Id, redirectToRouteResult.RouteValues["id"]);
            produto = pedidoRepository.GetModelById(pedido.Id).Produtos.First();
            Assert.AreEqual(Quantidade, produto.Quantidade);
            Assert.AreEqual(Codigo, produto.Codigo);
            Assert.AreEqual(Descricao, produto.Descricao);
            Assert.AreEqual(PrecoUnitario, produto.PrecoUnitario);
        }

        #endregion

        [TestMethod]
        public void TestDuplicate()
        {
            this.LoginAsAdmin();
            this.CreateRepresentante("my representante", true, "user");
            this.Logout();

            this.LoginAs("user");

            this.CreateAttribute(AttributeType.Pedido, "my attribute");
            m_VendedorId = this.CreateVendedor(new Vendedor { Nome = "vendedor" });
            Cliente cliente = new Cliente
            {
                RazaoSocial = "cliente",
                NomeFantasia = "cliente",
                Vendedor = new Vendedor {Id = m_VendedorId}
            };
            m_ClienteId = this.CreateCliente(cliente);
            m_TransportadoraId = this.CreateTransportadora(new Transportadora { Nome = "transportadora" });
            m_FabricaId = this.CreateFabrica("fabrica");

            Produto produto = new Produto
            {
                Codigo = "codigo",
                Descricao = "descricao",
                PrecoUnitario = 123.456,
                Quantidade = 345
            };

            Pedido pedido = new Pedido
            {
                CondicaoPagamento = CondicaoPagamento,
                Observacao = Observacao,
                PrazoEntrega = PrazoEntrega,
                Faturado = Faturado,
                Cancelado = Cancelado,
                Cliente = new Cliente {Id = m_ClienteId},
                Vendedor = new Vendedor {Id = m_VendedorId},
                Fabrica = new Fabrica {Id = m_FabricaId},
                Transportadora = new Transportadora {Id = m_TransportadoraId}
            };
            pedido.AddProduto(produto);
            pedido.AddAttributeValue(new AttributeValue
            {
                Attribute = new Attribute { Name = "my attribute" },
                Value = "my attribute value"
            });
            Guid pedidoId = this.CreatePedido(pedido);

            PedidoController pedidoController = new PedidoController(RepositoryProvider, SessionConfiguration, ControllerExtensionProvider, PrintTemplateSelector, ImpostProvider);
            ActionResult actionResult = pedidoController.Duplicate(pedidoId);

            Assert.IsInstanceOfType(actionResult, typeof(ViewResult));
            ViewResult viewResult = (ViewResult) actionResult;
            Assert.IsInstanceOfType(viewResult.Model, typeof(PedidoEditViewModel));
            PedidoEditViewModel pedidoEditViewModel = (PedidoEditViewModel) viewResult.Model;
            Assert.AreEqual(1, pedidoEditViewModel.Attributes.Count);
            Assert.AreEqual("_"  + pedido.AttributeValues.Single().Attribute.Name.Replace(' ', '_'), pedidoEditViewModel.Attributes.Single().Key);
            Assert.AreEqual(pedido.AttributeValues.Single().Value, pedidoEditViewModel.Attributes.Single().Value);
            Assert.IsNull(pedidoEditViewModel.Message);
            Pedido duplicatedPedido = ((Pedido)pedidoEditViewModel.Model);
            Assert.AreEqual(pedido.Cliente.Id, duplicatedPedido.Cliente.Id);
            Assert.AreEqual(pedido.Observacao, duplicatedPedido.Observacao);
            Assert.AreEqual(pedido.CondicaoPagamento, duplicatedPedido.CondicaoPagamento);
            Assert.AreEqual(pedido.Data, duplicatedPedido.Data);
            Assert.AreEqual(pedido.Fabrica, duplicatedPedido.Fabrica);
            Assert.AreEqual(pedido.PrazoEntrega, duplicatedPedido.PrazoEntrega);
            Assert.IsFalse(duplicatedPedido.Faturado);
            Assert.IsFalse(duplicatedPedido.Cancelado);
            Assert.AreEqual(1, duplicatedPedido.Produtos.Count());
            Assert.AreEqual(produto.Codigo, duplicatedPedido.Produtos.Single().Codigo);
            Assert.AreEqual(produto.Descricao, duplicatedPedido.Produtos.Single().Descricao);
            Assert.AreEqual(produto.PrecoUnitario, duplicatedPedido.Produtos.Single().PrecoUnitario);
            Assert.AreEqual(produto.Quantidade, duplicatedPedido.Produtos.Single().Quantidade);
            Assert.AreEqual(pedido.Transportadora.Id, duplicatedPedido.Transportadora.Id);
            Assert.AreEqual(pedido.Vendedor.Id, duplicatedPedido.Vendedor.Id);
        }

        [TestMethod]
        public void TestCreateAndDeleteFullPedido()
        {
            this.LoginAsAdmin();
            this.CreateRepresentante("my representante", true, "user");
            this.Logout();

            this.LoginAs("user");
            
            this.CreateAttribute(AttributeType.Pedido, "my attribute");
            m_VendedorId = this.CreateVendedor(new Vendedor{Nome = "vendedor"});
            Cliente cliente = new Cliente
            {
                RazaoSocial = "cliente",
                NomeFantasia = "cliente",
                Vendedor = new Vendedor {Id = m_VendedorId}
            };
            m_ClienteId = this.CreateCliente(cliente);
            m_TransportadoraId = this.CreateTransportadora(new Transportadora{Nome = "transportadora"});
            m_FabricaId = this.CreateFabrica("fabrica");

            Produto produto = new Produto
            {
                Codigo = "codigo",
                Descricao = "descricao",
                PrecoUnitario = 123.456,
                Quantidade = 345
            };

            Pedido pedido = new Pedido
            {
                CondicaoPagamento = CondicaoPagamento,
                Observacao = Observacao,
                PrazoEntrega = PrazoEntrega,
                Cliente = new Cliente {Id = m_ClienteId},
                Vendedor = new Vendedor {Id = m_VendedorId},
                Fabrica = new Fabrica {Id = m_FabricaId},
                Transportadora = new Transportadora {Id = m_TransportadoraId},
            };
            pedido.AddProduto(produto);
            pedido.AddAttributeValue(new AttributeValue
            {
                Attribute = new Attribute { Name = "my attribute" },
                Value = "my attribute value"
            });
            Guid pedidoId = this.CreatePedido(pedido);
            this.AddPost(pedidoId, "comentario");
            this.DeletePedido(pedidoId);
        }

        [TestMethod]
        public void TestAddPost()
        {
            const string Username = "username";
            this.LoginAsAdmin();
            this.CreateRepresentante("repre", true, Username);
            this.Logout();
            this.LoginAs(Username);
            Guid vendedorId = this.CreateVendedor(new Vendedor { Nome = "vendedor" });
            Cliente cliente = new Cliente
            {
                RazaoSocial = "cliente",
                NomeFantasia = "cliente",
                Vendedor = new Vendedor {Id = vendedorId}
            };
            Guid clienteId = this.CreateCliente(cliente);
            Guid transportadoraId = this.CreateTransportadora(new Transportadora { Nome = "transportadora" });
            Guid fabricaId = this.CreateFabrica("fabrica");
            Pedido pedido = new Pedido
            {
                Cliente = new Cliente {Id = clienteId},
                Vendedor = new Vendedor {Id = vendedorId},
                Fabrica = new Fabrica {Id = fabricaId},
                Transportadora = new Transportadora {Id = transportadoraId}
            };
            Guid pedidoId = this.CreatePedido(pedido);
            this.AddPost(pedidoId, "comentario");
        }

        [TestMethod]
        public void TestUnableToCreatePedidoIfNoVendedor()
        {
            const string Username = "username";
            this.LoginAsAdmin();
            this.CreateRepresentante("repre", true, Username);
            this.Logout();
            this.LoginAs(Username);
            this.CreateTransportadora(new Transportadora { Nome = "transportadora" });
            this.CreateFabrica("fabrica");
            using (PedidoController pedidoController = new PedidoController(RepositoryProvider, SessionConfiguration, ControllerExtensionProvider, PrintTemplateSelector, ImpostProvider))
            {
                ActionResult actionResult = pedidoController.Create();
                Assert.IsInstanceOfType(actionResult, typeof(ViewResult));
                ViewResult viewResult = (ViewResult) actionResult;
                Assert.IsInstanceOfType(viewResult.Model, typeof(PedidoEditViewModel));
                PedidoEditViewModel pedidoEditViewModel = (PedidoEditViewModel) viewResult.Model;
                Assert.IsNotNull(pedidoEditViewModel.Message);
            }
        }

        [TestMethod]
        public void TestUnableToCreatePedidoIfNoCliente()
        {
            const string Username = "username";
            this.LoginAsAdmin();
            this.CreateRepresentante("repre", true, Username);
            this.Logout();
            this.LoginAs(Username);
            this.CreateVendedor(new Vendedor { Nome = "vendedor" });
            this.CreateTransportadora(new Transportadora { Nome = "transportadora" });
            this.CreateFabrica("fabrica");
            using (PedidoController pedidoController = new PedidoController(RepositoryProvider, SessionConfiguration, ControllerExtensionProvider, PrintTemplateSelector, ImpostProvider))
            {
                ActionResult actionResult = pedidoController.Create();
                Assert.IsInstanceOfType(actionResult, typeof(ViewResult));
                ViewResult viewResult = (ViewResult) actionResult;
                Assert.IsInstanceOfType(viewResult.Model, typeof(PedidoEditViewModel));
                PedidoEditViewModel pedidoEditViewModel = (PedidoEditViewModel) viewResult.Model;
                Assert.IsNotNull(pedidoEditViewModel.Message);
            }
        }

        [TestMethod]
        public void TestUnableToCreatePedidoIfNoTransportadora()
        {
            const string Username = "username";
            this.LoginAsAdmin();
            this.CreateRepresentante("repre", true, Username);
            this.Logout();
            this.LoginAs(Username);
            Guid vendedorId = this.CreateVendedor(new Vendedor { Nome = "vendedor" });
            Cliente cliente = new Cliente
            {
                RazaoSocial = "cliente",
                NomeFantasia = "cliente",
                Vendedor = new Vendedor {Id = vendedorId}
            };
            this.CreateCliente(cliente);
            this.CreateFabrica("fabrica");
            using (PedidoController pedidoController = new PedidoController(RepositoryProvider, SessionConfiguration, ControllerExtensionProvider, PrintTemplateSelector, ImpostProvider))
            {
                ActionResult actionResult = pedidoController.Create();
                Assert.IsInstanceOfType(actionResult, typeof(ViewResult));
                ViewResult viewResult = (ViewResult) actionResult;
                Assert.IsInstanceOfType(viewResult.Model, typeof(PedidoEditViewModel));
                PedidoEditViewModel pedidoEditViewModel = (PedidoEditViewModel) viewResult.Model;
                Assert.IsNotNull(pedidoEditViewModel.Message);
            }
        }

        [TestMethod]
        public void TestUnableToCreatePedidoIfNoFabrica()
        {
            const string Username = "username";
            this.LoginAsAdmin();
            this.CreateRepresentante("repre", true, Username);
            this.Logout();
            this.LoginAs(Username);
            Guid vendedorId = this.CreateVendedor(new Vendedor { Nome = "vendedor" });
            Cliente cliente = new Cliente
            {
                RazaoSocial = "cliente",
                NomeFantasia = "cliente",
                Vendedor = new Vendedor {Id = vendedorId}
            };
            this.CreateCliente(cliente);
            this.CreateTransportadora(new Transportadora { Nome = "transportadora" });
            using (PedidoController pedidoController = new PedidoController(RepositoryProvider, SessionConfiguration, ControllerExtensionProvider, PrintTemplateSelector, ImpostProvider))
            {
                ActionResult actionResult = pedidoController.Create();
                Assert.IsInstanceOfType(actionResult, typeof(ViewResult));
                ViewResult viewResult = (ViewResult) actionResult;
                Assert.IsInstanceOfType(viewResult.Model, typeof(PedidoEditViewModel));
                PedidoEditViewModel pedidoEditViewModel = (PedidoEditViewModel) viewResult.Model;
                Assert.IsNotNull(pedidoEditViewModel.Message);
            }
        }

        [TestMethod]
        public void TestPrintPedido()
        {
            this.LoginAsAdmin();
            Guid representanteId = this.CreateRepresentante("repre", true, "u");
            Representante representante = RepositoryProvider.GetRepository<IRepresentanteRepository>().GetModelById(representanteId);
            this.Logout();
            this.LoginAs("u");
            Guid vendedorId = this.CreateVendedor("vendedor");
            Guid clienteId = this.CreateCliente("cliente", vendedorId);
            Guid fabricaId = this.CreateFabrica("fabrica");
            Guid transportadoraId = this.CreateTransportadora("transportadora");
            Guid pedidoId = this.CreatePedido(vendedorId, clienteId, transportadoraId, fabricaId);
            Pedido pedido = RepositoryProvider.GetRepository<IPedidoRepository>(ImpostProvider).GetModelById(pedidoId);
            PedidoController pedidoController = new PedidoController(RepositoryProvider, SessionConfiguration, ControllerExtensionProvider, PrintTemplateSelector, ImpostProvider);
            ActionResult actionResult = pedidoController.Print(pedidoId);
            Assert.IsInstanceOfType(actionResult, typeof(ViewResult));
            ViewResult viewResult = (ViewResult) actionResult;
            Assert.IsInstanceOfType(viewResult.Model, typeof(PedidoPrintViewModel));
            PedidoPrintViewModel defaultViewModel = (PedidoPrintViewModel)viewResult.Model;
            Assert.AreEqual(representante.RepresentanteInfo, defaultViewModel.RepresentanteInfo);
            Assert.AreEqual(pedido, defaultViewModel.Pedido);
        }

        [TestMethod]
        public void TestChangeVendedor()
        {
            this.LoginAsAdmin();
            this.CreateRepresentante("repre", true, "u");
            this.Logout();
            this.LoginAs("u");
            Guid vendedorId = this.CreateVendedor("vendedor");
            Guid vendedor2Id = this.CreateVendedor("vendedor2");
            Guid clienteId = this.CreateCliente("cliente", vendedorId);
            Guid fabricaId = this.CreateFabrica("fabrica");
            Guid transportadoraId = this.CreateTransportadora("transportadora");
            Guid pedidoId = this.CreatePedido(vendedorId, clienteId, transportadoraId, fabricaId);
            PedidoController pedidoController = new PedidoController(RepositoryProvider, SessionConfiguration, ControllerExtensionProvider, PrintTemplateSelector, ImpostProvider);
            pedidoController.Edit(pedidoId);
            pedidoController.Edit(clienteId, vendedor2Id, fabricaId, transportadoraId, DateTime.Today, null, null, null, 123, false, false);
            IPedidoRepository pedidoRepository = RepositoryProvider.GetRepository<IPedidoRepository>(ImpostProvider);
            Pedido pedido = pedidoRepository.GetModelById(pedidoId);
            Assert.AreEqual(vendedor2Id, pedido.Vendedor.Id);
        }

        [TestMethod]
        public void TestChangeCliente()
        {
            this.LoginAsAdmin();
            this.CreateRepresentante("repre", true, "u");
            this.Logout();
            this.LoginAs("u");
            Guid vendedorId = this.CreateVendedor("vendedor");
            Guid clienteId = this.CreateCliente("cliente", vendedorId);
            Guid cliente2Id = this.CreateCliente("cliente2", vendedorId);
            Guid fabricaId = this.CreateFabrica("fabrica");
            Guid transportadoraId = this.CreateTransportadora("transportadora");
            Guid pedidoId = this.CreatePedido(vendedorId, clienteId, transportadoraId, fabricaId);
            PedidoController pedidoController = new PedidoController(RepositoryProvider, SessionConfiguration, ControllerExtensionProvider, PrintTemplateSelector, ImpostProvider);
            pedidoController.Edit(pedidoId);
            pedidoController.Edit(cliente2Id, vendedorId, fabricaId, transportadoraId, DateTime.Today, null, null, null, 123, false, false);
            IPedidoRepository pedidoRepository = RepositoryProvider.GetRepository<IPedidoRepository>(ImpostProvider);
            Pedido pedido = pedidoRepository.GetModelById(pedidoId);
            Assert.AreEqual(cliente2Id, pedido.Cliente.Id);
        }

        [TestMethod]
        public void TestChangeFabrica()
        {
            this.LoginAsAdmin();
            this.CreateRepresentante("repre", true, "u");
            this.Logout();
            this.LoginAs("u");
            Guid vendedorId = this.CreateVendedor("vendedor");
            Guid clienteId = this.CreateCliente("cliente", vendedorId);
            Guid fabricaId = this.CreateFabrica("fabrica");
            Guid fabrica2Id = this.CreateFabrica("fabrica2");
            Guid transportadoraId = this.CreateTransportadora("transportadora");
            Guid pedidoId = this.CreatePedido(vendedorId, clienteId, transportadoraId, fabricaId);
            PedidoController pedidoController = new PedidoController(RepositoryProvider, SessionConfiguration, ControllerExtensionProvider, PrintTemplateSelector, ImpostProvider);
            pedidoController.Edit(pedidoId);
            pedidoController.Edit(clienteId, vendedorId, fabrica2Id, transportadoraId, DateTime.Today, null, null, null, 123, false, false);
            IPedidoRepository pedidoRepository = RepositoryProvider.GetRepository<IPedidoRepository>(ImpostProvider);
            Pedido pedido = pedidoRepository.GetModelById(pedidoId);
            Assert.AreEqual(fabrica2Id, pedido.Fabrica.Id);
        }

        [TestMethod]
        public void TestChangeTransportadora()
        {
            this.LoginAsAdmin();
            this.CreateRepresentante("repre", true, "u");
            this.Logout();
            this.LoginAs("u");
            Guid vendedorId = this.CreateVendedor("vendedor");
            Guid clienteId = this.CreateCliente("cliente", vendedorId);
            Guid fabricaId = this.CreateFabrica("fabrica");
            Guid transportadoraId = this.CreateTransportadora("transportadora");
            Guid transportadora2Id = this.CreateTransportadora("transportadora2");
            Guid pedidoId = this.CreatePedido(vendedorId, clienteId, transportadoraId, fabricaId);
            PedidoController pedidoController = new PedidoController(RepositoryProvider, SessionConfiguration, ControllerExtensionProvider, PrintTemplateSelector, ImpostProvider);
            pedidoController.Edit(pedidoId);
            pedidoController.Edit(clienteId, vendedorId, fabricaId, transportadora2Id, DateTime.Today, null, null, null, 123, false, false);
            IPedidoRepository pedidoRepository = RepositoryProvider.GetRepository<IPedidoRepository>(ImpostProvider);
            Pedido pedido = pedidoRepository.GetModelById(pedidoId);
            Assert.AreEqual(transportadora2Id, pedido.Transportadora.Id);
        }

        #region Statistics

        [TestMethod]
        public void TestStatisticsPecas()
        {
            this.LoginAsAdmin();
            this.CreateRepresentante("repre", true, "u");
            this.Logout();
            this.LoginAs("u");
            Guid vendedorId = this.CreateVendedor("vendedor");
            Guid clienteId = this.CreateCliente("cliente", vendedorId);
            Guid fabricaId = this.CreateFabrica("fabrica");
            Guid transportadoraId = this.CreateTransportadora("transportadora");
            PedidoController pedidoController = new PedidoController(RepositoryProvider, SessionConfiguration, ControllerExtensionProvider, PrintTemplateSelector, ImpostProvider);
            pedidoController.Create();
            pedidoController.ProdutoInsert(3, "a", "a", 1);
            pedidoController.ProdutoInsert(4, "b", "b", 1);
            pedidoController.Create(clienteId, vendedorId, fabricaId, transportadoraId, DateTime.Today, "",
                "", "", 1, false, false);
            pedidoController.Create();
            pedidoController.ProdutoInsert(5, "c", "c", 1);
            pedidoController.ProdutoInsert(6, "d", "d", 1);
            pedidoController.Create(clienteId, vendedorId, fabricaId, transportadoraId, DateTime.Today, "",
                "", "", 2, false, false);
            ActionResult actionResult = pedidoController.Index();
            Assert.IsInstanceOfType(actionResult, typeof(ViewResult));
            ViewResult viewResult = (ViewResult) actionResult;
            Assert.IsInstanceOfType(viewResult.Model, typeof(PedidoIndexViewModel));
            PedidoIndexViewModel pedidoIndexViewModel = (PedidoIndexViewModel) viewResult.Model;
            TabsViewModel tabsViewModel = pedidoIndexViewModel.GetExtraTabs(HtmlHelper);
            Assert.AreEqual(3, tabsViewModel.Tabs.Count());
            TabItem statisticsTabItem = tabsViewModel.Tabs.First();
            Assert.IsInstanceOfType(statisticsTabItem.Content, typeof (FormLayoutViewModel));
            FormLayoutViewModel formLayoutViewModel = (FormLayoutViewModel) statisticsTabItem.Content;
            LabelField labelField = formLayoutViewModel.Fields
                .OfType<LabelField>()
                .FirstOrDefault(x => x.Name == "pecas");
            Assert.IsNotNull(labelField);
            Assert.AreEqual(18, labelField.Value);
        }

        [TestMethod]
        public void TestStatisticsPecasSearch()
        {
            this.LoginAsAdmin();
            this.CreateRepresentante("repre", true, "u");
            this.Logout();
            this.LoginAs("u");
            Guid vendedorId = this.CreateVendedor("vendedor");
            Guid clienteId = this.CreateCliente("cliente", vendedorId);
            Guid fabricaId = this.CreateFabrica("fabrica");
            Guid transportadoraId = this.CreateTransportadora("transportadora");
            PedidoController pedidoController = new PedidoController(RepositoryProvider, SessionConfiguration, ControllerExtensionProvider, PrintTemplateSelector, ImpostProvider);
            pedidoController.ControllerContext = new ControllerContext(new MockHttpContext(), new RouteData(), pedidoController);
            pedidoController.Create();
            pedidoController.ProdutoInsert(3, "a", "a", 1);
            pedidoController.ProdutoInsert(4, "b", "b", 1);
            pedidoController.Create(clienteId, vendedorId, fabricaId, transportadoraId, DateTime.Today, "",
                "", "", 1, false, false);
            pedidoController.Create();
            pedidoController.ProdutoInsert(5, "c", "c", 1);
            pedidoController.ProdutoInsert(6, "d", "d", 1);
            pedidoController.Create(clienteId, vendedorId, fabricaId, transportadoraId, DateTime.Today, "",
                "", "", 2, false, false);
            ActionResult actionResult = pedidoController.Search(1, "", "", "", "", null, null, null, null, "", null, null, null, null, null, null, null, null, null, new FormCollection());
            Assert.IsInstanceOfType(actionResult, typeof(ViewResult));
            ViewResult viewResult = (ViewResult) actionResult;
            Assert.IsInstanceOfType(viewResult.Model, typeof(PedidoIndexViewModel));
            PedidoIndexViewModel pedidoIndexViewModel = (PedidoIndexViewModel) viewResult.Model;
            TabsViewModel tabsViewModel = pedidoIndexViewModel.GetExtraTabs(HtmlHelper);
            Assert.AreEqual(3, tabsViewModel.Tabs.Count());
            TabItem statisticsTabItem = tabsViewModel.Tabs.First();
            Assert.IsInstanceOfType(statisticsTabItem.Content, typeof (FormLayoutViewModel));
            FormLayoutViewModel formLayoutViewModel = (FormLayoutViewModel) statisticsTabItem.Content;
            LabelField labelField = formLayoutViewModel.Fields
                .OfType<LabelField>()
                .FirstOrDefault(x => x.Name == "pecas");
            Assert.IsNotNull(labelField);
            Assert.AreEqual(7, labelField.Value);
        }

        [TestMethod]
        public void TestStatisticsValorTotal()
        {
            this.LoginAsAdmin();
            this.CreateRepresentante("repre", true, "u");
            this.Logout();
            this.LoginAs("u");
            Guid vendedorId = this.CreateVendedor("vendedor");
            Guid clienteId = this.CreateCliente("cliente", vendedorId);
            Guid fabricaId = this.CreateFabrica("fabrica");
            Guid transportadoraId = this.CreateTransportadora("transportadora");
            PedidoController pedidoController = new PedidoController(RepositoryProvider, SessionConfiguration, ControllerExtensionProvider, PrintTemplateSelector, ImpostProvider);
            pedidoController.Create();
            pedidoController.ProdutoInsert(3, "a", "a", 1);
            pedidoController.ProdutoInsert(4, "b", "b", 1);
            pedidoController.Create(clienteId, vendedorId, fabricaId, transportadoraId, DateTime.Today, "",
                "", "", 1, false, false);
            pedidoController.Create();
            pedidoController.ProdutoInsert(5, "c", "c", 2);
            pedidoController.ProdutoInsert(6, "d", "d", 2);
            pedidoController.Create(clienteId, vendedorId, fabricaId, transportadoraId, DateTime.Today, "",
                "", "", 2, false, false);
            ActionResult actionResult = pedidoController.Index();
            Assert.IsInstanceOfType(actionResult, typeof(ViewResult));
            ViewResult viewResult = (ViewResult) actionResult;
            Assert.IsInstanceOfType(viewResult.Model, typeof(PedidoIndexViewModel));
            PedidoIndexViewModel pedidoIndexViewModel = (PedidoIndexViewModel) viewResult.Model;
            TabsViewModel tabsViewModel = pedidoIndexViewModel.GetExtraTabs(HtmlHelper);
            Assert.AreEqual(3, tabsViewModel.Tabs.Count());
            TabItem statisticsTabItem = tabsViewModel.Tabs.First();
            Assert.IsInstanceOfType(statisticsTabItem.Content, typeof (FormLayoutViewModel));
            FormLayoutViewModel formLayoutViewModel = (FormLayoutViewModel) statisticsTabItem.Content;
            LabelField labelField = formLayoutViewModel.Fields
                .OfType<LabelField>()
                .FirstOrDefault(x => x.Name == "valorTotal");
            Assert.IsNotNull(labelField);
            Assert.AreEqual("R$ 29,00", labelField.Value);
        }

        [TestMethod]
        public void TestStatisticsValorTotalSearch()
        {
            this.LoginAsAdmin();
            this.CreateRepresentante("repre", true, "u");
            this.Logout();
            this.LoginAs("u");
            Guid vendedorId = this.CreateVendedor("vendedor");
            Guid clienteId = this.CreateCliente("cliente", vendedorId);
            Guid fabricaId = this.CreateFabrica("fabrica");
            Guid transportadoraId = this.CreateTransportadora("transportadora");
            PedidoController pedidoController = new PedidoController(RepositoryProvider, SessionConfiguration, ControllerExtensionProvider, PrintTemplateSelector, ImpostProvider);
            pedidoController.ControllerContext = new ControllerContext(new MockHttpContext(), new RouteData(), pedidoController);
            pedidoController.Create();
            pedidoController.ProdutoInsert(3, "a", "a", 1);
            pedidoController.ProdutoInsert(4, "b", "b", 1);
            pedidoController.Create(clienteId, vendedorId, fabricaId, transportadoraId, DateTime.Today, "",
                "", "", 1, false, false);
            pedidoController.Create();
            pedidoController.ProdutoInsert(5, "c", "c", 2);
            pedidoController.ProdutoInsert(6, "d", "d", 2);
            pedidoController.Create(clienteId, vendedorId, fabricaId, transportadoraId, DateTime.Today, "",
                "", "", 2, false, false);
            ActionResult actionResult = pedidoController.Search(1, "", "", "", "", null, null, null, null, "", null, null, null, null, null, null, null, null, null, new FormCollection());
            Assert.IsInstanceOfType(actionResult, typeof(ViewResult));
            ViewResult viewResult = (ViewResult) actionResult;
            Assert.IsInstanceOfType(viewResult.Model, typeof(PedidoIndexViewModel));
            PedidoIndexViewModel pedidoIndexViewModel = (PedidoIndexViewModel) viewResult.Model;
            TabsViewModel tabsViewModel = pedidoIndexViewModel.GetExtraTabs(HtmlHelper);
            Assert.AreEqual(3, tabsViewModel.Tabs.Count());
            TabItem statisticsTabItem = tabsViewModel.Tabs.First();
            Assert.IsInstanceOfType(statisticsTabItem.Content, typeof (FormLayoutViewModel));
            FormLayoutViewModel formLayoutViewModel = (FormLayoutViewModel) statisticsTabItem.Content;
            LabelField labelField = formLayoutViewModel.Fields
                .OfType<LabelField>()
                .FirstOrDefault(x => x.Name == "valorTotal");
            Assert.IsNotNull(labelField);
            Assert.AreEqual("R$ 7,00", labelField.Value);
        }

        [TestMethod]
        public void TestStatisticsValorMedio()
        {
            this.LoginAsAdmin();
            this.CreateRepresentante("repre", true, "u");
            this.Logout();
            this.LoginAs("u");
            Guid vendedorId = this.CreateVendedor("vendedor");
            Guid clienteId = this.CreateCliente("cliente", vendedorId);
            Guid fabricaId = this.CreateFabrica("fabrica");
            Guid transportadoraId = this.CreateTransportadora("transportadora");
            PedidoController pedidoController = new PedidoController(RepositoryProvider, SessionConfiguration, ControllerExtensionProvider, PrintTemplateSelector, ImpostProvider);
            pedidoController.Create();
            pedidoController.ProdutoInsert(3, "a", "a", 1);
            pedidoController.ProdutoInsert(4, "b", "b", 1);
            pedidoController.Create(clienteId, vendedorId, fabricaId, transportadoraId, DateTime.Today, "",
                "", "", 1, false, false);
            pedidoController.Create();
            pedidoController.ProdutoInsert(5, "c", "c", 2);
            pedidoController.ProdutoInsert(6, "d", "d", 2);
            pedidoController.Create(clienteId, vendedorId, fabricaId, transportadoraId, DateTime.Today, "",
                "", "", 2, false, false);
            ActionResult actionResult = pedidoController.Index();
            Assert.IsInstanceOfType(actionResult, typeof(ViewResult));
            ViewResult viewResult = (ViewResult) actionResult;
            Assert.IsInstanceOfType(viewResult.Model, typeof(PedidoIndexViewModel));
            PedidoIndexViewModel pedidoIndexViewModel = (PedidoIndexViewModel) viewResult.Model;
            TabsViewModel tabsViewModel = pedidoIndexViewModel.GetExtraTabs(HtmlHelper);
            Assert.AreEqual(3, tabsViewModel.Tabs.Count());
            TabItem statisticsTabItem = tabsViewModel.Tabs.First();
            Assert.IsInstanceOfType(statisticsTabItem.Content, typeof (FormLayoutViewModel));
            FormLayoutViewModel formLayoutViewModel = (FormLayoutViewModel) statisticsTabItem.Content;
            LabelField labelField = formLayoutViewModel.Fields
                .OfType<LabelField>()
                .FirstOrDefault(x => x.Name == "valorMedio");
            Assert.IsNotNull(labelField);
            Assert.AreEqual("R$ 14,50", labelField.Value);
        }

        [TestMethod]
        public void TestStatisticsValorMedioSearch()
        {
            this.LoginAsAdmin();
            this.CreateRepresentante("repre", true, "u");
            this.Logout();
            this.LoginAs("u");
            Guid vendedorId = this.CreateVendedor("vendedor");
            Guid clienteId = this.CreateCliente("cliente", vendedorId);
            Guid fabricaId = this.CreateFabrica("fabrica");
            Guid transportadoraId = this.CreateTransportadora("transportadora");
            PedidoController pedidoController = new PedidoController(RepositoryProvider, SessionConfiguration, ControllerExtensionProvider, PrintTemplateSelector, ImpostProvider);
            pedidoController.ControllerContext = new ControllerContext(new MockHttpContext(), new RouteData(), pedidoController);
            pedidoController.Create();
            pedidoController.ProdutoInsert(3, "a", "a", 1);
            pedidoController.ProdutoInsert(4, "b", "b", 1);
            pedidoController.Create(clienteId, vendedorId, fabricaId, transportadoraId, DateTime.Today, "",
                "", "", 1, false, false);
            pedidoController.Create();
            pedidoController.ProdutoInsert(5, "c", "c", 2);
            pedidoController.ProdutoInsert(6, "d", "d", 2);
            pedidoController.Create(clienteId, vendedorId, fabricaId, transportadoraId, DateTime.Today, "",
                "", "", 2, false, false);
            ActionResult actionResult = pedidoController.Search(1, "", "", "", "", null, null, null, null, "", null, null, null, null, null, null, null, null, null, new FormCollection());
            Assert.IsInstanceOfType(actionResult, typeof(ViewResult));
            ViewResult viewResult = (ViewResult) actionResult;
            Assert.IsInstanceOfType(viewResult.Model, typeof(PedidoIndexViewModel));
            PedidoIndexViewModel pedidoIndexViewModel = (PedidoIndexViewModel) viewResult.Model;
            TabsViewModel tabsViewModel = pedidoIndexViewModel.GetExtraTabs(HtmlHelper);
            Assert.AreEqual(3, tabsViewModel.Tabs.Count());
            TabItem statisticsTabItem = tabsViewModel.Tabs.First();
            Assert.IsInstanceOfType(statisticsTabItem.Content, typeof (FormLayoutViewModel));
            FormLayoutViewModel formLayoutViewModel = (FormLayoutViewModel) statisticsTabItem.Content;
            LabelField labelField = formLayoutViewModel.Fields
                .OfType<LabelField>()
                .FirstOrDefault(x => x.Name == "valorMedio");
            Assert.IsNotNull(labelField);
            Assert.AreEqual("R$ 7,00", labelField.Value);
        }

        [TestMethod]
        public void TestStatisticsPorcentagem()
        {
            this.LoginAsAdmin();
            this.CreateRepresentante("repre", true, "u");
            this.Logout();
            this.LoginAs("u");
            Guid vendedor1Id = this.CreateVendedor("vendedor1");
            Guid vendedor2Id = this.CreateVendedor("vendedor2");
            Guid clienteId = this.CreateCliente("cliente", vendedor1Id);
            Guid fabricaId = this.CreateFabrica("fabrica");
            Guid transportadoraId = this.CreateTransportadora("transportadora");
            PedidoController pedidoController = new PedidoController(RepositoryProvider, SessionConfiguration, ControllerExtensionProvider, PrintTemplateSelector, ImpostProvider);
            pedidoController.Create();
            pedidoController.ProdutoInsert(3, "a", "a", 1);
            pedidoController.ProdutoInsert(4, "b", "b", 1);
            pedidoController.Create(clienteId, vendedor1Id, fabricaId, transportadoraId, DateTime.Today, "",
                "", "", 1, false, false);
            pedidoController.Create();
            pedidoController.ProdutoInsert(5, "c", "c", 2);
            pedidoController.ProdutoInsert(6, "d", "d", 2);
            pedidoController.Create(clienteId, vendedor2Id, fabricaId, transportadoraId, DateTime.Today, "",
                "", "", 2, false, false);
            ActionResult actionResult = pedidoController.Index();
            Assert.IsInstanceOfType(actionResult, typeof(ViewResult));
            ViewResult viewResult = (ViewResult) actionResult;
            Assert.IsInstanceOfType(viewResult.Model, typeof(PedidoIndexViewModel));
            PedidoIndexViewModel pedidoIndexViewModel = (PedidoIndexViewModel) viewResult.Model;
            TabsViewModel tabsViewModel = pedidoIndexViewModel.GetExtraTabs(HtmlHelper);
            Assert.AreEqual(3, tabsViewModel.Tabs.Count());
            TabItem statisticsTabItem = tabsViewModel.Tabs.First();
            Assert.IsInstanceOfType(statisticsTabItem.Content, typeof (FormLayoutViewModel));
            FormLayoutViewModel formLayoutViewModel = (FormLayoutViewModel) statisticsTabItem.Content;
            LabelField labelField = formLayoutViewModel.Fields
                .OfType<LabelField>()
                .FirstOrDefault(x => x.Name == "porcentagem");
            Assert.IsNotNull(labelField);
            Assert.AreEqual("100,0%", labelField.Value);
        }

        [TestMethod]
        public void TestStatisticsPorcentagemSearch()
        {
            this.LoginAsAdmin();
            this.CreateRepresentante("repre", true, "u");
            this.Logout();
            this.LoginAs("u");
            Guid vendedor1Id = this.CreateVendedor("vendedor1");
            Guid vendedor2Id = this.CreateVendedor("vendedor2");
            Guid clienteId = this.CreateCliente("cliente", vendedor1Id);
            Guid fabricaId = this.CreateFabrica("fabrica");
            Guid transportadoraId = this.CreateTransportadora("transportadora");
            PedidoController pedidoController = new PedidoController(RepositoryProvider, SessionConfiguration, ControllerExtensionProvider, PrintTemplateSelector, ImpostProvider);
            pedidoController.ControllerContext = new ControllerContext(new MockHttpContext(), new RouteData(), pedidoController);
            pedidoController.Create();
            pedidoController.ProdutoInsert(3, "a", "a", 1);
            pedidoController.ProdutoInsert(4, "b", "b", 1);
            pedidoController.Create(clienteId, vendedor1Id, fabricaId, transportadoraId, DateTime.Today, "",
                "", "", 1, false, false);
            pedidoController.Create();
            pedidoController.ProdutoInsert(5, "c", "c", 2);
            pedidoController.ProdutoInsert(6, "d", "d", 2);
            pedidoController.Create(clienteId, vendedor2Id, fabricaId, transportadoraId, DateTime.Today, "",
                "", "", 2, false, false);
            ActionResult actionResult = pedidoController.Search(null, vendedor1Id.ToString(), "", "", "", null, null, null, null, "", null, null, null, null, null, null, null, null, null, new FormCollection());
            Assert.IsInstanceOfType(actionResult, typeof(ViewResult));
            ViewResult viewResult = (ViewResult) actionResult;
            Assert.IsInstanceOfType(viewResult.Model, typeof(PedidoIndexViewModel));
            PedidoIndexViewModel pedidoIndexViewModel = (PedidoIndexViewModel) viewResult.Model;
            TabsViewModel tabsViewModel = pedidoIndexViewModel.GetExtraTabs(HtmlHelper);
            Assert.AreEqual(3, tabsViewModel.Tabs.Count());
            TabItem statisticsTabItem = tabsViewModel.Tabs.First();
            Assert.IsInstanceOfType(statisticsTabItem.Content, typeof (FormLayoutViewModel));
            FormLayoutViewModel formLayoutViewModel = (FormLayoutViewModel) statisticsTabItem.Content;
            LabelField labelField = formLayoutViewModel.Fields
                .OfType<LabelField>()
                .FirstOrDefault(x => x.Name == "porcentagem");
            Assert.IsNotNull(labelField);
            Assert.AreEqual("24,1%", labelField.Value);
        }

        #endregion
    }
}
